package com.ys.day27.p3线程池;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述: 线程池：流水线工厂比较类似流水线的工厂模式
 *  线程池(一般时固定最大可控制的线程池)
 *  核心原理:
 *    1: 单任务数量超过线程池时,会把要执行的任务先放入put 阻塞队列中 BlockQueue
 *    2: 当一个线程执行完任务时就会空闲,此时就会从阻塞队列中去取任务 再执行
 *    3: 当阻塞队列里的任务全部都执行完了,就会进入阻塞状态,需要去关闭线程池
 *    扩展核心:
 *     1: 线程池只会被创建一次,(一般来说消耗资源的对象,都执行一次创建)
 *     2: 虽然我们指定了线程池的初始大小,但是它不是一次就创建了5个线程来使用,而是 当任务数超过了 cap 才会创建cap个线程,
 *        当线程忙时再把其他任务加载进入阻塞队列
 *  步骤:
 *  1: 创建一个线程池 核心线程长度为 5
 *  2: 创建100个任务Runnable
 *  3: 把任务交给线程池去执行
 *
 *
 * @author CodeYang
 * @version 2021/1/6 20:13
 */
public class P1了解线程池机制 {

    public static void main(String[] args) {

        ExecutorService pool = Executors.newFixedThreadPool(5);

        for (int i = 0; i <20 ; i++) {
            final int index = i;
            //execute( Runnable command) 是把任务当作 命令|动作 交给池去处理
            pool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"--启动--任务:"+(index+1));
                }
            });
        }
        // 关闭线程池
        pool.shutdown();

        /**
         * pool-1-thread-1--启动--任务:1
         * pool-1-thread-2--启动--任务:2
         * pool-1-thread-1--启动--任务:6
         * pool-1-thread-2--启动--任务:7
         * pool-1-thread-1--启动--任务:8
         * pool-1-thread-1--启动--任务:10
         * pool-1-thread-1--启动--任务:11
         * pool-1-thread-1--启动--任务:12
         * pool-1-thread-2--启动--任务:9
         * pool-1-thread-2--启动--任务:14
         * pool-1-thread-2--启动--任务:15
         * pool-1-thread-2--启动--任务:16
         * pool-1-thread-2--启动--任务:17
         * pool-1-thread-2--启动--任务:18
         * pool-1-thread-2--启动--任务:19
         * pool-1-thread-2--启动--任务:20
         * pool-1-thread-1--启动--任务:13
         * pool-1-thread-5--启动--任务:5
         * pool-1-thread-4--启动--任务:4
         * pool-1-thread-3--启动--任务:3
         */
    }
}
